const express = require('express')
const app = express()
const joi = require('@hapi/joi')

const path = require('path')

// 解决跨域问题
const cors = require('cors')
app.use(cors())

// 配置解析form表单的中间件
app.use(express.urlencoded({ extended: false }))
// 配置解析json的中间件
app.use(express.json())

// 导入全局配置
const config = require('./config')

// 解析token的中间件
const expressJwt = require('express-jwt')

// 使用.unless({ path: [/^\/api\//] }) 指定哪些接口不需要进行token认证
app.use(expressJwt({ secret: config.jwtSecretKey }).unless({ path: [/^\/api\//, /^\/docx\//]} ))

// 配置处理失败的中间件
app.use((req, res, next) => {
    res.cc = (err, status = 1) => {
        res.send({
            status,
            message: err instanceof Error ? err.message : err
        })
    }
    next()
})

// 导入并注册-用户路由模块
const userRouter = require('./router/user')
app.use('/api', userRouter)

//导入并注册-用户信息路由模块
const userInfoRouter = require('./router/userinfo')
app.use('/my', userInfoRouter)

// 导入并注册-公告模块
const noticeRouter = require('./router/notice')
app.use('/not', noticeRouter)

// 导入并注册-实验报告模块
const reportRouter = require('./router/report')
app.use('/rep', reportRouter)

// 导入并注册-科目模块
const subjectRouter = require('./router/subject')
app.use('/api', subjectRouter)

// 导入并注册-管理员获取用户信息
const manageInfoRouter = require('./router/manageUser')
app.use('/ma', manageInfoRouter)

// 导入并注册-文件上传
const upload = require('./router/upload')
app.use('/up', upload)

app.use(express.static(path.join(__dirname, 'public')))

// 定义捕获验证失败错误的中间件
app.use((err, req, res, next) => {
    // 捕获由joi验证错误
    if (err instanceof joi.ValidationError) return res.send({status: 1, message: err.message})
    // 捕获身份认证失败
    if (err.name === 'UnauthorizedError') return res.send({status: 1, message: 'Token认证失败'})
    // 未知错误
    res.send({
        status: 1,
        message: err.message
    })
})

// 基地址
const host = 'yournewdomain.com'


app.listen(5006, () => {
    console.log('api server running at http://127.0.0.1:5005')
})